package com.svh.Controlador;

import com.svh.Entidad.Vehiculo;
import com.svh.Paginator.VehiculoPaginador;
import com.svh.Paginator.Paginador;
import com.svh.Servicios.VehiculoServicio;
import com.svh.Utils.ExcelExporter;
import com.svh.Utils.Exporter;
import com.svh.Utils.Utilitario;
import java.io.IOException;
import java.io.OutputStream;
import java.io.Serializable;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import org.primefaces.model.LazyDataModel;

/**
 *
 * @author Luis Alonso Ballena Garcia
 */
@ManagedBean(name = "vehiculoControlador")
@ViewScoped
public class VehiculoControlador implements Serializable {

    private Vehiculo vehiculo;
    private LazyDataModel<Vehiculo> vehiculos;
    private VehiculoServicio vehiculoServicio;
    @ManagedProperty("#{sesionControlador}")
    SesionControlador sesionControlador;

    public VehiculoControlador() {

    }

    public void initLista() {
        if (!FacesContext.getCurrentInstance().isPostback()) {
             vehiculos = new Paginador<Vehiculo>(new VehiculoPaginador());
            sesionControlador.generarModulo(10);
            /**
             * NUMERO MAGICO T_T *
             */
        }
    }

    public void initRegistrar() {
        if (!FacesContext.getCurrentInstance().isPostback()) {
            vehiculo = new Vehiculo();
        }
    }

    public void initActualizar() {
        if (!FacesContext.getCurrentInstance().isPostback()) {
            Object parameter = Utilitario.getFlash("idVehiculo");
            if (parameter == null) {
                Utilitario.redireccionarJSF(FacesContext.getCurrentInstance(), "/views/vehiculo/list.xhtml");
                return;
            }
            vehiculoServicio = new VehiculoServicio();
            vehiculo = vehiculoServicio.obtenerVehiculoporid((Integer) parameter);
        }

    }

    public void registrar() {
        if (!esVistaValida()) {
            return;
        }
        vehiculoServicio = new VehiculoServicio();
        vehiculoServicio.registrarVehiculo(vehiculo);
        limpiar();
    }

    public void actualizar() {
        if (!esVistaValida()) {
            return;
        }
        vehiculoServicio.actVehiculo(vehiculo);

    }

    public String irActualizar(int id) {
        Utilitario.putFlash("idVehiculo", id);
        return "update.xhtml?faces-redirect=true";
    }

    private boolean esVistaValida() {
        boolean resultado = true;
        if (!esmarca()) {
            resultado = false;
        } else if (!esmodelo()) {
            resultado = false;
        } else if (!escarga()) {
            resultado = false;
        }else if(!esmatricula()){
            resultado=false;
        }
        return resultado;
    }
    
    private boolean esmarca(){
        boolean resultado=true;
        
        if(Utilitario.esNulo(vehiculo.getMarca().trim())){
            Utilitario.enviarMensajeGlobalError("ingrese marca");
            resultado=false;
        } else if(!Utilitario.esRangoValido(vehiculo.getMarca(), 45)){
            Utilitario.enviarMensajeGlobalError("El máximo de caracteres para la marca es 45");
            resultado=false;
        }
        return resultado;
    }
    
    private boolean esmodelo(){
         boolean resultado=true;
         if(Utilitario.esNulo(vehiculo.getModelo().trim())){
            Utilitario.enviarMensajeGlobalError("ingrese modelo");
            resultado=false;
        } else if(!Utilitario.esRangoValido(vehiculo.getModelo(), 45)){
            Utilitario.enviarMensajeGlobalError("El máximo de caracteres para el modelo es 45");
            resultado=false;
        }
        return resultado; 
    }
    private boolean escarga(){
           boolean resultado=true;
         if(Utilitario.esNulo(vehiculo.getCarga().trim())){
            Utilitario.enviarMensajeGlobalError("ingrese carga");
            resultado=false;
        } else if(!Utilitario.esRangoValido(vehiculo.getCarga(), 45)){
            Utilitario.enviarMensajeGlobalError("El máximo de caracteres para  carga es 45");
            resultado=false;
        }
        return resultado;  
    }
    private boolean esmatricula(){
            boolean resultado=true;
         if(Utilitario.esNulo(vehiculo.getMatricula().trim())){
            Utilitario.enviarMensajeGlobalError("ingrese matricula");
            resultado=false;
        } else if(!Utilitario.esRangoValido(vehiculo.getMatricula(), 45)){
            Utilitario.enviarMensajeGlobalError("El máximo de caracteres para la matricula es 45");
            resultado=false;
        }
        return resultado; 
    }
    private void limpiar() {
        vehiculo = new Vehiculo();
    }

    public void exportar() {
        List<Exporter> datos = ((Paginador) vehiculos).getAllList();
        ExcelExporter da = new ExcelExporter(Vehiculo.class);
        da.agregarHeader("Vehiculos");
        da.crearDocumento(datos);
        FacesContext facesContext = FacesContext.getCurrentInstance();
        ExternalContext externalContext = facesContext.getExternalContext();
        externalContext = ExcelExporter.getResponseContent(externalContext, "Lista_vehiculos");
        try {
            OutputStream outputStream = externalContext.getResponseOutputStream();
            da.exportarDocumento(outputStream);
            externalContext.setResponseStatus(200);
            externalContext.responseFlushBuffer();
            facesContext.responseComplete();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * GETTERS AND SETTERS *
     */
    public Vehiculo getVehiculo() {
        return vehiculo;
    }

    public void setVehiculo(Vehiculo vehiculo) {
        this.vehiculo = vehiculo;
    }

    public void setSesionControlador(SesionControlador sesionControlador) {
        this.sesionControlador = sesionControlador;
    }

    public LazyDataModel<Vehiculo> getVehiculos() {
        return vehiculos;
    }

    public void setVehiculos(LazyDataModel<Vehiculo> vehiculos) {
        this.vehiculos = vehiculos;
    }

}
